S3のデフォルトの暗号化設定でSSE-S3を選択している時のバケットキー有効・無効の挙動
こんにちは、なおにしです。
AWS マネジメントコンソールから S3 バケットを作成する際、「デフォルトの暗号化」に関する指定が必要になっています。デフォルトでは以下のように指定されています。
この画面に記載されている説明を読んだ時、つまりバケットキーの目的を考えると、このように思う方もいらっしゃるのではないでしょうか。
「SSE-S3 を選択しているのだから、バケットキーは無効で良いのでは?」
上記のように考えた方がこの記事の対象読者です。
先に結論
-
暗号化タイプがSSE-S3に設定された状態でバケットキー有効を指定してオブジェクトをアップロードしても、バケットキーは適用されずに無視されます
-
「デフォルトの暗号化」設定で「暗号化タイプ:SSE-S3 /バケットキー:無効」を選択していても、オブジェクトのアップロード時に暗号化タイプをSSE-KMS に指定することができます
- したがって、意図せず「暗号化タイプ:SSE-KMS /バケットキー:無効」のオブジェクトが作成される可能性があるのでご注意ください
-
バケットキーを使用することができない、または使用してはならないという特別な事情がない限り、暗号化タイプのデフォルトとしてSSE-S3 を選択していても、バケットキーは有効のままで問題ありません
- バケットキーを有効にしている時の注意点としては、例えば以下のような状況があります
はじめに
正直私も最初は冒頭に記載のとおり考えてしまっていました。。とりあえずどこかに仲間はいないかなと探してみると、
いました。(良かった!)
というわけで、実際のところ上記の設定はどのように考えれば良いのかを検討してみます。
バケットキーのメリットについてはこちらの記事をご参照ください。
SSE-KMS を選択した時のメリットは理解できるのですが、気になるのはSSE-S3 を選択した時の挙動なので、実際に確認してみます。
やってみた
「デフォルトの暗号化」設定の暗号化タイプとバケットキーの組み合わせごとにバケットを作成して挙動を確認してみます。バケットキーはDSSE-KMS ではサポートされていないため、パターンとしては以下のとおりです。
暗号化タイプ | バケットキー | 今回作成したバケット名 |
---|---|---|
SSE-S3 | 無効 | test-sse-s3-bucket-key-disable-xxxxx |
SSE-S3 | 有効 | test-sse-s3-bucket-key-enable-xxxxx |
SSE-KMS | 無効 | test-sse-kms-bucket-key-disable-xxxxx |
SSE-KMS | 有効 | test-sse-kms-bucket-key-enable-xxxxx |
ドキュメントに以下のとおりAWS CLIを用いてオブジェクトレベルでバケットキーを設定する方法があったため、各パターンのS3 バケットに対してそれぞれオブジェクトをアップロードして検証します。
まず、各バケットの暗号化設定は以下のコマンドで確認できます。
aws s3api get-bucket-encryption --bucket (バケット名)
暗号化タイプもバケットキーも指定せずにオブジェクトをアップロードする場合
以下のコマンドでそれぞれファイルをアップロードして確認します。
aws s3api put-object --key (オブジェクトのキー名) --body (アップロードするファイル名) --bucket (バケット名)
「aws s3api put-object」コマンドを使用してファイルをアップロードすると、レスポンスとして暗号化タイプとバケットキーも返ってきます。
意図どおり、「暗号化タイプ:SSE-KMS /バケットキー:有効」のS3 バケットではオブジェクトの格納時にバケットキーが適用されているようです。一方で、「暗号化タイプ:SSE-S3 /バケットキー:有効」のS3 バケットではバケットキーのレスポンスがありません。バケットキーの有無については以下のコマンドで確認することもできます。
aws s3api head-object --key (オブジェクトのキー名) --bucket (バケット名)
改めて確認してみましたが、「暗号化タイプ:SSE-S3 /バケットキー:有効」のS3 バケットにオブジェクトを格納してもバケットキーは適用されないようです。
暗号化タイプ:SSE-KMS、バケットキー:未指定でオブジェクトをアップロードする場合
次に、暗号化タイプがSSE-KMS になるように明示的に指定してアップロードしてみます。
aws s3api put-object --key (オブジェクトのキー名) --server-side-encryption aws:kms --body (アップロードするファイル名) --bucket (バケット名)
暗号化タイプは指定どおりSSE-KMS が適用されています。注目する部分は赤枠の箇所です。暗号化タイプを明示的にSSE-KMS に指定したことで、未指定だった場合に適用されなかったバケットキーの有効設定が今回は適用されています。
つまり、「デフォルトの暗号化」設定で暗号化タイプとしてSSE-S3 を選んでいるかどうかに関わらず、SSE-KMS が適用されたオブジェクトであればバケットキーのデフォルト設定が有効である場合、オブジェクトのバケットキーは有効になると認識すれば良さそうです。
暗号化タイプ:SSE-S3、バケットキー:未指定でオブジェクトをアップロードする場合
先ほどとは逆に暗号化タイプが全てSSE-S3 になるように明示的に指定してアップロードしてみます。
aws s3api put-object --key (オブジェクトのキー名) --server-side-encryption AES256 --body (アップロードするファイル名) --bucket (バケット名)
明示的に指定した暗号化タイプが優先されるため、「暗号化タイプ:SSE-KMS /バケットキー:有効」のS3 バケットでも、オブジェクトはSSE-S3 の暗号化タイプとして格納されてバケットキーは無効になっていることが確認できました。
暗号化タイプ:SSE-KMS、バケットキー:有効を指定してオブジェクトをアップロードする場合
それでは次はバケットキーを明示的に有効にしてアップロードしてみます。
aws s3api put-object --key (オブジェクトのキー名) --server-side-encryption aws:kms --bucket-key-enabled --body (アップロードするファイル名) --bucket (バケット名)
こちらも明示的に指定された内容が優先されるため、どのパターンでも暗号化タイプがSSE-KMS になっていることからバケットキーも有効になっています。
暗号化タイプ:SSE-S3、バケットキー:有効を指定してオブジェクトをアップロードする場合
最後に上記の組み合わせを試してみます。
aws s3api put-object --key (オブジェクトのキー名) --server-side-encryption AES256 --bucket-key-enabled --body (アップロードするファイル名) --bucket (バケット名)
ここまでくると予想どおりかもしれませんが、暗号化タイプが明示的にSSE-S3 になっているため、バケットキーはコマンドで有効化されていようとバケットのデフォルト設定で有効化されていようと実際には適用されていません。
(補足) マネジメントコンソールでオブジェクトをアップロードする場合
マネジメントコンソールからオブジェクトをアップロードする際、「サーバー側の暗号化」の項目からオブジェクトレベルで暗号化タイプを指定(バケットのデフォルト設定を上書き)することができます。ただし、マネジメントコンソールではバケットキーのデフォルト設定をオブジェクトレベルで上書きすることはできません。
まとめ
普段からAPIを意識してS3 バケットにオブジェクトをアップロードしたりコピーしたりしている方にとっては当たり前のことかもしれませんが、例えばインフラエンジニアの方がS3 バケットを作成するといったケースで設計しようとした際は意外と考えてしまうことではないかと思いまとめてみました。
本記事がどなたかのお役に立てれば幸いです。